package com.clouddms.repository;

import com.clouddms.entity.FileInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 文件信息数据访问层接口
 * 提供文件相关的数据库操作方法
 */
@Repository
public interface FileRepository extends JpaRepository<FileInfo, Long> {

    /**
     * 根据用户ID查找文件列表
     * @param userId 用户ID
     * @return 文件列表
     */
    List<FileInfo> findByUserId(Long userId);

    /**
     * 根据用户ID和是否删除状态查找文件
     * @param userId 用户ID
     * @param isDeleted 是否删除
     * @return 文件列表
     */
    List<FileInfo> findByUserIdAndIsDeleted(Long userId, Boolean isDeleted);

    /**
     * 根据MD5哈希查找文件
     * @param md5Hash MD5哈希值
     * @return 文件对象
     */
    Optional<FileInfo> findByMd5Hash(String md5Hash);

    /**
     * 根据存储文件名查找文件
     * @param storedFilename 存储文件名
     * @return 文件对象
     */
    Optional<FileInfo> findByStoredFilename(String storedFilename);

    /**
     * 根据文件类型ID查找文件
     * @param typeId 文件类型ID
     * @return 文件列表
     */
    List<FileInfo> findByTypeId(Integer typeId);

    /**
     * 根据加密状态查找文件
     * @param isEncrypted 是否加密
     * @return 文件列表
     */
    List<FileInfo> findByIsEncrypted(Boolean isEncrypted);

    /**
     * 根据删除状态查找文件（管理员功能）
     * @param isDeleted 是否删除
     * @return 文件列表
     */
    List<FileInfo> findByIsDeleted(Boolean isDeleted);

    /**
     * 根据创建时间范围查找文件
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 文件列表
     */
    List<FileInfo> findByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计用户文件数量
     * @param userId 用户ID
     * @return 文件数量
     */
    long countByUserId(Long userId);

    /**
     * 统计用户文件数量（按删除状态）
     * @param userId 用户ID
     * @param isDeleted 是否删除
     * @return 文件数量
     */
    long countByUserIdAndIsDeleted(Long userId, Boolean isDeleted);

    /**
     * 统计用户文件总大小
     * @param userId 用户ID
     * @param isDeleted 是否删除
     * @return 文件总大小
     */
    @Query("SELECT COALESCE(SUM(f.fileSize), 0) FROM FileInfo f WHERE f.userId = :userId AND f.isDeleted = :isDeleted")
    Long sumFileSizeByUserIdAndIsDeleted(@Param("userId") Long userId, @Param("isDeleted") Boolean isDeleted);

    /**
     * 查找需要清理的文件（已删除且超过指定天数）
     * @param deletedBefore 删除时间早于此时间的文件
     * @return 文件列表
     */
    @Query("SELECT f FROM FileInfo f WHERE f.isDeleted = true AND f.updatedAt < :deletedBefore")
    List<FileInfo> findFilesToCleanup(@Param("deletedBefore") LocalDateTime deletedBefore);

    /**
     * 查找用户的大文件（超过指定大小）
     * @param userId 用户ID
     * @param minSize 最小文件大小
     * @return 文件列表
     */
    @Query("SELECT f FROM FileInfo f WHERE f.userId = :userId AND f.fileSize >= :minSize AND f.isDeleted = false ORDER BY f.fileSize DESC")
    List<FileInfo> findLargeFilesByUserId(@Param("userId") Long userId, @Param("minSize") Long minSize);

    /**
     * 根据用户标签查找文件
     * @param userId 用户ID
     * @param tag 标签
     * @return 文件列表
     */
    @Query("SELECT f FROM FileInfo f WHERE f.userId = :userId AND f.userTags LIKE %:tag% AND f.isDeleted = false")
    List<FileInfo> findByUserIdAndUserTagsContaining(@Param("userId") Long userId, @Param("tag") String tag);

    /**
     * 统计系统总文件数量
     * @return 总文件数量
     */
    @Query("SELECT COUNT(f) FROM FileInfo f WHERE f.isDeleted = false")
    long countActiveFiles();

    /**
     * 统计系统总存储大小
     * @return 总存储大小
     */
    @Query("SELECT COALESCE(SUM(f.fileSize), 0) FROM FileInfo f WHERE f.isDeleted = false")
    Long sumTotalActiveFileSize();
}